package com.songlanyun.modules.chain.service;

import com.songlanyun.common.utils.PageUtils;
import com.songlanyun.modules.account.entity.AccountEntity;
import com.songlanyun.modules.account.entity.UserIdentityAssetEntity;
import com.songlanyun.modules.chain.entity.ChainEntity;
import com.songlanyun.modules.chain.model.dto.*;
import com.songlanyun.modules.chain.model.vo.ChainVO;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 调用区块链服务 api
 *
 * @author zhangqh
 */
public interface ChainService {


    /**
     * 为账号创建区块链地址
     *
     * @return String 用户区块链地址
     */
    String createAccountAddress(Long uid);

    /**
     * 用户账户积分提现
     *
     * @param chainWithdrawalDTO 积分提现入参
     */
    void createWithdrawal(ChainWithdrawalDTO chainWithdrawalDTO);

    /**
     * 区块链服务-代币充值成功
     *
     * @param chainNoticeRechargeDTO 代币充值成功回调入参
     */
    void recharge(ChainNoticeRechargeDTO chainNoticeRechargeDTO);

    /**
     * 区块链服务-积分提现成功回调
     * @param noticeRechargeDTO
     */
    void withdrawalNotice(ChainNoticeWithdrawalDTO noticeRechargeDTO);

    /**
     * 前端用户获取账户地址
     *
     * @param userId 用户id
     * @return
     */
    AccountEntity getAccountAddress(Long userId);

    /**
     * 前端获取用户资产信息
     * @param userId
     * @return
     */
    UserIdentityAssetEntity getUserIdentityAsset(Long userId);

    /**
     * 前端用户提现手续费
     *
     * @return
     */
    UserWithdrawPreviewDTO preview(BigDecimal value);

    /**
     * 前端用户积分提现操作
     *
     * @param userWithdrawalDTO 入参
     * @param userId 用户id
     */
    void withdrawal(UserWithdrawalDTO userWithdrawalDTO, Long userId);

    /**
     * 积分提现 减积分
     * @param chainEntity
     */
    void outer(ChainEntity chainEntity);

    /**
     * 控制台查询积分转账记录
     * @param params
     * @return
     */
    PageUtils queryPage(Map<String, Object> params);

    /**
     * 控制台-积分转账审核
     *
     * @param chainVO
     */
    void audit(ChainVO chainVO);

    /**
     * 实时获取积分价格， 5s钟一次
     * @return
     */
    BigDecimal pointPrice();
}
